import axios from "axios";
import store from "@/store/index";
import {ElMessage} from "element-plus";
import Cookies from "js-cookie"

const CancelToken = axios.CancelToken;

export function httpRequest(method: string, url: string, get_params: object, post_params: object, mockType: string, isNotCancelAxios: boolean, responseType: any) {
    return new Promise((resolve, reject) => {
        const options = {
            method: method,
            url: url,
            params: get_params,
            data: post_params,
            baseURL: mockType === "proxy" ? "/proxy-api" : "/local-api",
            // `transformRequest` 允许在向服务器发送前，修改请求数据
            // 只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法
            // 后面数组中的函数必须返回一个字符串，或 ArrayBuffer，或 Stream
            // transformRequest: [function (data: any, headers: any) {
            //     // 对 data 进行任意转换处理
            //     return data;
            // }],
            // `transformResponse` 在传递给 then/catch 前，允许修改响应数据
            // transformResponse: [function (data:any) {
            //     // 对 data 进行任意转换处理
            //     return data;
            // }],
            responseType: responseType ? responseType : 'json',
            cancelToken: new CancelToken(function(cancel) {
                if (!isNotCancelAxios) {
                    store.commit("PUSH_AXIOS_CANCELS", cancel);
                }
            }),
        };
        // 添加请求拦截器
        axios.interceptors.request.use(config => {
            // 在发送请求之前做些什么
            const csrftoken = Cookies.get('csrftoken')
            if (config.url != "/user/login" && config.url != "/user/register" && csrftoken) {
                config.headers.Authorization = "Bearer " + csrftoken;
            }
            return config;
        }, function(error) {
            // 对请求错误做些什么
            return Promise.reject(error);
        });
        // eslint-disable-next-line @typescript-eslint/ban-ts-comment
        // @ts-ignore
        // 添加响应拦截器
        axios.interceptors.response.use(res => {
            // 对响应数据做点什么
            if (res && res.status >= 200  && res.status < 300) {
                return Promise.resolve(res);
            }
        }, error => {
            // 对响应错误做点什么
            if (error.response.status === 301) {
                const redirectUrl = error.response.headers.redirect_url; // 获取重定向的URL
                // 进行重定向操作或者修改请求的配置
                window.location.href = redirectUrl
            } else if(error.response.status === 302) {
                const redirectUrl = error.response.data.redirect_url
                window.location.href = redirectUrl
            } else if (error.response && error.response.status === 401) {  //token过期了直接就清空本地缓存，跳转到登陆页
                localStorage.clear();
                window.location.href = '/login'
                return
            } else if (error.response && error.response.status === 500) {
                ElMessage.error(error.response.data)
            }
        });
        axios(options).then(res => {
            resolve(res);
        }).catch(e => {
            if (axios.isCancel(e)) {
                // 请求中断提示
                console.error('请求取消了',e)
            }
            console.error(e);
            reject()
        });
    });
}

export default {
    httpRequest
};
